package Tools;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import robotlion.model.Case;
import java.awt.Dimension;

/**
 *
 * @author Jérémy
 */
public class ImageConverter {
    private Case matriceCarte[][];
    private int hauteurImage;
    private int largeurImage;
    private File fichierImage;
    
    public ImageConverter(String imageFilePath){
        fichierImage = new File(imageFilePath);
        this.creerMatrice();
    }
    
    public ImageConverter(File imageFile)
    {
        fichierImage = imageFile;
        this.creerMatrice();
    }
    
    /**
     * Crée la matrice de cases la carte en fonction du fichierImage
     */
    private void creerMatrice(){
        try {
            BufferedImage image = ImageIO.read(fichierImage);     
            Raster tramePixel = image.getRaster();
            ColorModel modeleCouleur = image.getColorModel();
            hauteurImage = tramePixel.getHeight()/20*20;    // la taille doit être un multiple de 20 (pour pouvoir réduire la résolution de l'image)
            largeurImage = tramePixel.getWidth()/20*20;
            Object objCouleur;
            int moyennePixel;
            
            int matriceImage[][] = new int[largeurImage][hauteurImage];  
            
            for (int x = 0; x< largeurImage; x++){
                for (int y = 0; y < hauteurImage; y++){
                    objCouleur = tramePixel.getDataElements(x, y, null);
                    moyennePixel = (modeleCouleur.getRed(objCouleur) 
                            + modeleCouleur.getGreen(objCouleur) 
                            + modeleCouleur.getBlue(objCouleur)) / 3;
                    matriceImage[x][y] = 255-moyennePixel;  // car 255 = blanc, 0 = noir
                }
            }
            
            // matriceCarte correspond à la matriceImage avec une résolution plus faible
            matriceCarte = new Case[largeurImage/20][hauteurImage/20];
            
            // diminution de la résolution (carrés de 20*20 pixels = unité) :
            int maxPetitCarre = 0;
            for (int x = 0; x < largeurImage; x += 20){
                for (int y = 0; y < hauteurImage; y += 20){

                    for (int xPetitCarre = x; xPetitCarre < x + 20; xPetitCarre++){
                        for (int yPetitCarre = y; yPetitCarre < y + 20; yPetitCarre++){
                            if(maxPetitCarre < matriceImage[xPetitCarre][yPetitCarre]){
                                maxPetitCarre = matriceImage[xPetitCarre][yPetitCarre];
                            }
                        }
                    }
                    
                    matriceCarte[x/20][y/20] = new Case(maxPetitCarre);
                    maxPetitCarre = 0;
                }
            }
            
        } catch (IOException ex) {
            
        }  
    }
    
    /*
     * Crée une image en niveaux de gris par rapport à la matrice en prenant en compte
     * le fait que la résolution de l'image de base à été diminuée
     */
    public void creerImageCarte(String filePath) throws IOException{
        File fichier = new File(filePath);
        BufferedImage image = new BufferedImage(matriceCarte.length*20, matriceCarte[0].length*20, BufferedImage.TYPE_INT_RGB);
 
        int niveauCase;
        int rgb;
        for(int x = 0; x < matriceCarte.length*20; x+=20){
            for(int y = 0; y < matriceCarte[0].length*20; y+=20){
                niveauCase = matriceCarte[x/20][y/20].getAccessibilite();
                rgb = 65536 * (255-niveauCase) + 256 * (255-niveauCase) + (255-niveauCase); // rgb = 65536 * r + 256 * gr + b
                for (int xPetitCarre = x; xPetitCarre < x + 20; xPetitCarre++){
                    for (int yPetitCarre = y; yPetitCarre < y + 20; yPetitCarre++){
                        image.setRGB(xPetitCarre, yPetitCarre, rgb);
                    }
                }
            }
        }        
        ImageIO.write(image,"jpg",fichier);
    }

    public Case[][] getMatriceCarte() {
        return matriceCarte;
    }
    
    public int GetLargeurImage()
    {
        return largeurImage;
    }
    
    public int GetHauteurImage()
    {
        return hauteurImage;
    }
    
    public Dimension GetDimensionImage()
    {
        return new Dimension(largeurImage, hauteurImage);
    }
}